package ltd.hanamaki.study.jdbc.utiltest;

import ltd.hanamaki.study.enumstudy.EnumDemo;
import ltd.hanamaki.study.jdbc.util.JDBCUtils;

import java.sql.*;

public class JDBCUtilsTest {

    public static void main(String[] args) {
//        query();

//        sql_zr(" ' or ' 1=1 ", " ' or ' 1=1 ");
//        sql_zr("hanamaki", "123456");
//        sql_jj_zr("hanamaki", "123456");
//        sql_jj_zr(" ' or ' 1=1 ", " ' or ' 1=1 ");

//        insert("haha", "123456");
//        update("haha", "111111");
//        delete("haha");

        transaction(1, 3, 100);
    }

    /* 查询操作  */
    public static void query() {
        try {
            Connection con = JDBCUtils.getCon();
            /* 4. 执行查询操作 */
            /* 4.1 ，创建一个 能够编写 sql 语句以及执行sql 语句的 对象 */
            Statement statement = con.createStatement();
            /* 4.2 编写 sql语句 */
            String sql = "select * from hello";
            /* 4.3 执行sql语句 */
            ResultSet resultSet = statement.executeQuery(sql);
            /* 遍历结果集 得到具体的 信息 */
            while (resultSet.next()) {
                System.out.println(resultSet.getObject("id"));
            }
            JDBCUtils.release(con, statement, resultSet, null);
        } catch (Exception e) {

        } finally {
        }
    }

    /* sql注入问题 */
    /* 模拟登录业务 */
    public static void sql_zr(String username, String password) {
        try {
            Connection con = JDBCUtils.getCon();
            /* 4. 执行查询操作 */
            /* 4.1 ，创建一个 能够编写 sql 语句以及执行sql 语句的 对象 */
            Statement statement = con.createStatement();
            /* 4.2 编写 sql语句 */
            String sql = "select * from mysources.login where username='" + username + "'" + "and password = '" + password + "'";
            /* 4.3 执行sql语句 */
            System.out.println(sql);
            ResultSet resultSet = statement.executeQuery(sql);
            /* 遍历结果集 得到具体的 信息 */
            while (resultSet.next()) {
                System.out.println("当前登录用户为：" + resultSet.getObject("username") + "----" + resultSet.getObject("password"));
            }
            JDBCUtils.release(con, statement, resultSet, null);
        } catch (Exception e) {

        } finally {
        }

    }

    /* 解决sql 注入 问题 */
    public static void sql_jj_zr(String username, String password) {
        try {
            Connection con = JDBCUtils.getCon();
            /* 4. 执行查询操作 */
            /* 4.1 ，创建一个 能够编写 sql 语句以及执行sql 语句的 对象 */
            String sql = "select * from mysources.login where username= ? and password = ?";

            PreparedStatement preparedStatement = con.prepareStatement(sql);
            preparedStatement.setString(1, username);
            preparedStatement.setString(2, password);
            /* 4.2 编写 sql语句 */
            /* 4.3 执行sql语句 */
            System.out.println(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            /* 遍历结果集 得到具体的 信息 */
            while (resultSet.next()) {
                System.out.println("当前登录用户为：" + resultSet.getObject("username") + "----" + resultSet.getObject("password"));
            }
            JDBCUtils.release(con, null, resultSet, preparedStatement);
        } catch (Exception e) {

        } finally {
        }

    }

    /* 添加操作 */
    public static void insert(String username, String password) {
        try {
            Connection con = JDBCUtils.getCon();
            /* 4. 执行查询操作 */
            /* 4.1 ，创建一个 能够编写 sql 语句以及执行sql 语句的 对象 */
            String sql = "INSERT INTO `mysources`.`login`(`username`, `password`) VALUES (?, ?)";
            PreparedStatement preparedStatement = con.prepareStatement(sql);
            preparedStatement.setString(1, username);
            preparedStatement.setString(2, password);
            /* 4.2 编写 sql语句 */
            /* 4.3 执行sql语句 */
            System.out.println(sql);
            int i = preparedStatement.executeUpdate();
            /* 遍历结果集 得到具体的 信息 */
            if (i > 0) {
                System.out.println(EnumDemo.SUCCESS);
            } else {
                System.out.println(EnumDemo.ERROR);
            }
            JDBCUtils.release(con, null, null, preparedStatement);
        } catch (Exception e) {

        } finally {
        }
    }

    /* 修改操作  */
    public static void update(String username, String password) {
        try {
            Connection con = JDBCUtils.getCon();
            /* 4. 执行查询操作 */
            /* 4.1 ，创建一个 能够编写 sql 语句以及执行sql 语句的 对象 */
            String sql = "update login set password = ? where username = ?";
            PreparedStatement preparedStatement = con.prepareStatement(sql);
            preparedStatement.setString(1, password);
            preparedStatement.setString(2, username);
            /* 4.2 编写 sql语句 */
            /* 4.3 执行sql语句 */
            System.out.println(sql);
            int i = preparedStatement.executeUpdate();
            /* 遍历结果集 得到具体的 信息 */
            if (i > 0) {
                System.out.println(EnumDemo.SUCCESS);
            } else {
                System.out.println(EnumDemo.ERROR);
            }
            JDBCUtils.release(con, null, null, preparedStatement);
        } catch (Exception e) {

        } finally {
        }
    }

    /* 删除操作  */
    public static void delete(String username) {
        try {
            Connection con = JDBCUtils.getCon();
            /* 4. 执行查询操作 */
            /* 4.1 ，创建一个 能够编写 sql 语句以及执行sql 语句的 对象 */
            String sql = "delete from login where username = ?";
            PreparedStatement preparedStatement = con.prepareStatement(sql);
            preparedStatement.setString(1, username);
            /* 4.2 编写 sql语句 */
            /* 4.3 执行sql语句 */
            System.out.println(sql);
            int i = preparedStatement.executeUpdate();
            /* 遍历结果集 得到具体的 信息 */
            if (i > 0) {
                System.out.println(EnumDemo.SUCCESS);
            } else {
                System.out.println(EnumDemo.ERROR);
            }
            JDBCUtils.release(con, null, null, preparedStatement);
        } catch (Exception e) {

        } finally {
        }
    }

    /* java操作事务 */
    /* 想要用事务 1. 首先要将事务的自动提交 关闭  */
    /* 模拟转账操作 */
    /* id =1 给 id =2 转帐500  */
    public static void transaction(int transferPersonId, int payeeId, int money) {
        Connection con = null;
        try {
            /* Connection:代表数据库 */
            con = JDBCUtils.getCon();
            System.out.println(con.toString());
            /* 想要用事务 1. 首先要将事务的自动提交 关闭 */
            /* con.setAutoCommit(false); 将事务的自动提交 关闭  */
            con.setAutoCommit(false);
            String sql1 = "update money set money = money-? where id = ?";
            String sql2 = "update money set money = money+? where id = ?";
            PreparedStatement p1 = con.prepareStatement(sql1);
            p1.setInt(1, money);
            p1.setInt(2, transferPersonId);
            PreparedStatement p2 = con.prepareStatement(sql2);
            p2.setInt(1, money);
            p2.setInt(2, payeeId);
            p1.executeUpdate();
            p2.executeUpdate();
            /* 如果 在 try 监控区域中 就是成功的sql */
            con.commit();
            System.out.println("事务" + EnumDemo.SUCCESS);

        } catch (SQLException e) {
            try {
                con.rollback();
                System.out.println("事务" + EnumDemo.ERROR);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }


        } finally {
        }
    }
}
